#include "PL.h"
#include "DL_MD.h"
#include "DL_MH.h"
 #include "Data_Buffer.h"
 
#include "My_PARAM.h"
#include <math.h>
#include  "usart.h" // HAL 相关
#include "tim.h"    //HAL相关

 

 //“测试gitee  2021.7.20”
 //gitee 2021.7.30测试



//探测到WakeUP信号
/***************
void Detect_PL_WakeUP_Callback(void){
	  Event_PL_WakeUP();
}
***************/



//******************************MaxUARTFrameTimer操作函数********************************

//开启MaxUartFrameTimer
#ifdef __DEBUG__
     void PL_Start_MaxUARTframeTimer(void){
		 
	  }
		
		 
    void PL_Start_MaxCycleTimer(void ){
		
	 }
#else 
     void PL_Start_MaxUARTframeTimer(void){
    //待更新  ·与STM32硬件有关
	    MaxUARTFrameTimer.Init.Prescaler =72; //假设STM32是72M
	    MaxUARTFrameTimer.Init.Period=tm_MaxUARTframeTime_us;
	   if (HAL_TIM_Base_Init(&MaxUARTFrameTimer) != HAL_OK)
      {
          Error_Handler();
      }
	   HAL_TIM_Base_Start(&MaxUARTFrameTimer); //开启UARTFrame定时器
    }
  
		
		//  CycleTimer定时器相关函数**************************************************************
    void PL_Start_MaxCycleTimer(void ){
   	   //待更新  ·与STM32硬件有关
	      MaxCycleTimer.Init.Prescaler =72; //假设STM32是72M
	      MaxCycleTimer.Init.Period=tm_MaxCycleTime_us;
	     if (HAL_TIM_Base_Init(&MaxCycleTimer) != HAL_OK)
       {
          Error_Handler();
       }
			HAL_TIM_Base_Start(&MaxCycleTimer); //开启定时器
    }
		
#endif


//定时器停止
void PL_Stop_MaxUARTframTimer(void){
	  HAL_TIM_Base_Stop(&MaxUARTFrameTimer);//停止定时器
	 
}

//UARTFrame定时器重新开启
void PL_Restart_MaxUARTframeTimer(void){
	  MaxUARTFrameTimer.Instance->CNT=0x0000;
	
}


//MaxUartFrameTimer超时中断回调函数
void PL_MaxUARTframeTimer_IRQHandler(void){
	   
     Event_tm_MaxUARTframeTime();
}

//******************************MaxUARTFrameTimer操作函数 结束********************************






//停止CycleTimer定时器
void PL_Stop_MaxCycleTimer(void){
	
	  HAL_TIM_Base_Stop(&MaxCycleTimer);
	
}

//  CycleTimer定时器相关函数 结束**************************************************************
 



//初始化IO_LINK的串口,需要在离开Inactive进入Idle时候调用
void PL_Init(void){
	 /*************
	 MX_GPIO_Init();
   MX_USART1_UART_Init();
   MX_TIM1_Init();
	 MX_TIM2_Init();
	 MX_TIM3_Init();
	 MX_TIM4_Init();
	
	
	**************/
	
	//物理层初始化,在MX中已经初始化为了 ,但中断接收未初始化
  IO_LINK_UART.Instance->CR1|=1<<5;  //开启接收中断
	 
}

void PL_UnInit(void){
	  IO_LINK_UART.Instance->CR1&=~(1<<5);  //关闭接收中断
	
}

//发送MC数据
void PL_Transfer_Rep(void){
    HAL_UART_Transmit_IT(&IO_LINK_UART,MC_STRUCT.SendBuffer,MC_STRUCT.TxBytes); 
}


//准备接收下一个MC序列，此函数多余，下面的PL_Transfer_Ind已经完成相应功能
void PL_Recv_Ready(void){
	//将接收缓冲区指针指向缓冲区头部
	//
	
	
}
//接收MC数据 
void PL_Transfer_Ind(void){
	   if(MH_STATE==MH_Idle_1){ //如果是IDle状态接收首字
			      MH_STATE=MH_GetMessage_2; 
			     //读取首字 , 其内容相当于DL_MH_T2
			     *MC_STRUCT.MC=IO_LINK_UART.Instance->DR& (uint8_t)0x00FF;
			     ParasMC(); //解析首字,决定后续还有多少字要接收
			     MC_STRUCT.RecevieBuffer=&BasicBufferInOut[1];
			     PL_Start_MaxUARTframeTimer();  
          if(MD_STATE==MD_OPerate_4){   //如果是在Operate,开启CycleTimer
              PL_Start_MaxCycleTimer( ); 
          }
			   
		 }else if(MH_STATE==MH_GetMessage_2){
			    //读取后续字节
			    * MC_STRUCT.RecevieBuffer=IO_LINK_UART.Instance->DR& (uint8_t)0x00FF;
			      MC_STRUCT.RecevieBuffer++;
			      if(MC_STRUCT.RecevieBuffer==MC_STRUCT.SendBuffer){  //说明接收完毕
							  Event_MH_Completed();
						} 
			 
		 }
	
}

 





//TimerFlag_TYPE PL_Timer_Flag;// 记录是那个定时器，以便决定回调函数
// 获取当前速度COM1 COM2 COM3
MODE_TYPE PL_Get_COMSpeed(void)
{
	//待更新
	 return COM1 ;
	
}
//开启定时器 Tdiso，使用TIM3
void PL_Start_TdisoTimer(void){
		   //待更新  ·与STM32硬件有关
	htim3.Init.Prescaler =720; //根据表41 Tdiso确定为为250ms，则定时器设置分别为720，和25000
	    htim3.Init.Period=25000;
	   if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
      {
          Error_Handler();
      }
			HAL_TIM_Base_Start(&htim3); //开启定时器

}

void PL_Start_FBDTimer(void){
	   	   //待更新  ·与STM32硬件有关
	htim4.Init.Prescaler =720; //根据表42 Tdiso确定为为500ms，则定时器设置分别为720，和50000
	    htim4.Init.Period=50000;
	   if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
      {
          Error_Handler();
      }
			HAL_TIM_Base_Start(&htim4); //开启定时器
	
}


////定时器回调函数
//void PL_Timer_Callback(TimerFlag_TYPE TimerFlag){
//   if(TimerFlag==Tfbd_Flag){
//       MD_STATE=MD_Idle_0;
//       DL_MD_T8_9();
//       return;
//   }
//   if(TimerFlag==Tdsio_Flag){
//       MD_STATE=MD_Idle_0;
//       DL_MD_T10();
//       return;
//   }
//}
 



//开启MaxUartFrameTimer时器
 

 

//硬件输出动作
void PL_Output(uint8_t * output,uint8_t outputLen){
	//待更新
	
}

//定时器回调 
void MaxCycleTimer_Callback(void){
  
}





 


  //当为执行器时候，错误情况下的安全防护动作
void   Actions_of_Actuator_In_Error(void){
    
}


 //从Flash中读出相应的数据
//从flash地址读取DataLen长度的数据到*Data
void PL_ReadFlash(uint32_t FlashAddr,uint8_t * Data,uint8_t DataLen){
  
}  
//将数据写入Flash
void PL_WriteFlash(uint32_t FlashAddr,uint8_t * Data,uint8_t DataLen){
  
}


//2021.7.20日  新定义PL层*******************************
//此服务被System Management调用，用于切换从站状态
void PL_SetMode_Req(void){
	
	
}


//此服务为被主站调用,用于主站唤醒从站
void PL_Wakeup_Req(void){
	
	   Event_PL_WakeUP();
}

//建立好通讯的回调函数，由硬件Driver调用
void EstablishCOM_Callback(void){
	 Event_Successful_COMx();
}



 
 
